function app( ) {
    debugger
    setTimeout(() => {
        setTimeout(() => {
            console.log("1-1");
            Promise.resolve().then(() => {
              console.log("2-1");
            });
        });
        console.log("1-2");
        Promise.resolve().then(() => {
            console.log("1-3");
            setTimeout(() => {
                console.log("3-1");
            });
        });
    });
}
app();

/**
 * 宏任务：常见的定时器，用户交互事件等等（宏任务就是特定的这些任务，没有什么特殊的意义）
 * 微任务：微任务Promise相关的任务，MutationObserver等（一样，只是一种称呼而已）
 * 
 * 到底先执行微任务还是宏任务
 * ---先有鸡还是先有蛋? 到底是先有宏任务还是微任务啊?
 * 
 * 第一原则：
 * -----万物皆从全局上下文准备退出，全局的同步代码运行结束的这个时机开始; console.log("1-2") 执行后同步代码就执行完了
 * 第二原则：
 * ----同一层级下（后文会将），微任务永远比宏任务先执行，即Promise.then()比setTimeout()先执行 ； 先执行 "1-3" 在执行 "1-1";
 * 第三原则:
 * ----每个宏任务，都单独关联了一个微任务队列
 * ----异步任务中，同一作用域下 微任务比宏任务先执行
 * ----每个层级的宏任务，都对应了他们的微任务队列，微任务队列遵循了先进先出的原则，当全局同步代码执行完毕后，就开始第一层级的任务。同一层级的微任务
 *     永远先于宏任务执行，并且会在当前层级的宏任务结束前全部执行完毕
*/